package com.star.system.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.star.common.vo.DictVO;
import com.star.system.dto.DictSaveDTO;
import com.star.system.dto.DictUpdateDTO;
import com.star.system.dto.DictUpdateTypeDTO;
import com.star.system.entity.Dict;
import com.star.system.enums.TypeCode;
import com.star.system.vo.DictData;
import com.star.system.vo.DictType;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 字典 服务类
 *
 * @author yangzj
 */
public interface DictService extends IService<Dict> {

    /**
     * 保存批量
     *
     * @param dto dto
     */
    void save(DictSaveDTO dto);

    /**
     * 更新
     *
     * @param dto dto
     */
    void update(DictUpdateDTO dto);

    /**
     * 更新类型
     *
     * @param dto dto
     */
    void updateType(DictUpdateTypeDTO dto);

    /**
     * 删除
     *
     * @param typeCode 类型编码
     */
    void deleteByType(String typeCode);

    /**
     * 删除由ids
     *
     * @param ids id
     */
    void deleteByIds(List<Long> ids);

    /**
     * 列出所有 包括枚举的
     *
     * @return {@link List}<{@link DictVO}>
     */
    List<DictVO> listAll();

    /**
     * 类型列表
     *
     * @return {@link List}<{@link DictType}>
     */
    List<DictType> listType();

    /**
     * 数据列表
     *
     * @param typeCode 类型编码
     * @return {@link List}<{@link DictData}>
     */
    List<DictData> listData(String typeCode);

    /**
     * 数据列表
     *
     * @param typeCode 类型编码
     * @return {@link List}<{@link DictData}>
     */
    List<DictData> listData(TypeCode typeCode);

    /**
     * 列表数据map key=code value=name
     *
     * @param typeCode 类型编码
     * @return {@link Map}<{@link String}, {@link String}>
     */
    Map<String, String> getMapForCode(TypeCode typeCode);

    /**
     * 列表数据map key=name value=code
     *
     * @param typeCode 类型编码
     * @return {@link Map}<{@link String}, {@link String}>
     */
    Map<String, String> getMapForName(TypeCode typeCode);

    /**
     * 列表数据名称
     *
     * @param typeCode 类型编码
     * @return {@link Set}<{@link String}>
     */
    Set<String> listDataName(TypeCode typeCode);
}
